# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QWidget, QApplication,QMainWindow,QHBoxLayout
from Public.RequestUtils import StocksRequest

# 绘制行情类
class K线图工具类(QWidget):
    左侧补丁边距 = 45
    右侧补丁边距 = 45
    顶部补丁边距 = 25
    底部补丁边距 = 1
    总宽 = 左侧补丁边距 + 右侧补丁边距
    总高 = 顶部补丁边距 + 底部补丁边距
    主窗宽 = 0
    主窗高 = 0
    表格高度 = 0
    表格宽度 = 0


    def __init__(self, parent):
        # 初始化
        super(K线图工具类, self).__init__()
        self.parent = parent
        self.paint = QtGui.QPainter()
        # 度量尺对象
        self.metrics = self.paint.fontMetrics()
        self.字体库 = dict()
        self.字体库['默认字体'] = QtGui.QFont('Serif', 9, QtGui.QFont.Light)
        self.字体库['雅黑加粗字体'] = QtGui.QFont('Serif', 12, QtGui.QFont.Bold)
        self.字体库['雅黑字体'] = QtGui.QFont('Serif', 12, QtGui.QFont.Light)
        self.设置当前字体('默认字体')
        # 设置笔刷样式库
        self.笔刷样式库 = dict()
        # 红色 1px粗  1px点 2px距 线条
        self.笔刷样式库['红色1px虚线'] = QtGui.QPen(QtCore.Qt.red, 1, QtCore.Qt.DashLine)
        self.笔刷样式库['红色1px虚线'].setDashPattern([1, 2])
        self.笔刷样式库['红色1px线'] = QtGui.QPen(QtCore.Qt.red, 1, QtCore.Qt.SolidLine)
        self.笔刷样式库['白色1px线'] = QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.SolidLine)
        self.笔刷样式库['绿色1px线'] = QtGui.QPen(QtCore.Qt.green, 1, QtCore.Qt.SolidLine)
        self.笔刷样式库['黄色1px线'] = QtGui.QPen(QtCore.Qt.yellow, 1, QtCore.Qt.SolidLine)
        self.笔刷样式库['亮蓝1px线'] = QtGui.QPen(QtCore.Qt.cyan, 1, QtCore.Qt.SolidLine)

    def 开始绘制(self):
        self.绘制表格()
        self.绘制表格上方的股票信息()
        self.绘制K线()
        self.绘制MACD()
        self.绘制VOL()
    def paintEvent(self, event):
        # 获得窗口的长和宽
        主窗口大小 = self.parent.size()
        self.主窗宽 = 主窗口大小.width()
        self.主窗高 = 主窗口大小.height()
        self.表格高度 = self.主窗高 - self.总高
        self.表格宽度 = self.主窗宽 - self.总宽
        self.paint.begin(self)
        self.开始绘制()
        self.paint.end()  # 结束

    def 绘制表格(self):
        self.设置当前笔刷('红色1px线')
        self.paint.setBrush(QtCore.Qt.NoBrush)
        self.paint.drawRect(0, 0, self.主窗宽 - 1, self.主窗高 - 1)
        # 画分主边框
        self.paint.drawRect(self.左侧补丁边距, self.顶部补丁边距, self.主窗宽 - self.总宽, self.主窗高 - self.总高)
        # 成交量和走势的分界线(成交量和走势三七割)
        self.paint.drawLine(self.左侧补丁边距, self.表格高度 * 0.6 + self.顶部补丁边距, self.主窗宽 - self.右侧补丁边距,
                            self.表格高度 * 0.6 + self.顶部补丁边距)
        self.paint.drawLine(self.左侧补丁边距, self.表格高度 * 0.8 + self.顶部补丁边距, self.主窗宽 - self.右侧补丁边距,
                            self.表格高度 * 0.8 + self.顶部补丁边距)

    def 设置当前字体(self, code='默认字体'):
        self.paint.setFont(self.字体库[code])

    def 设置当前笔刷(self, code='default'):
        self.paint.setPen(self.笔刷样式库[code])

    def 绘制表格上方的股票信息(self):
        self.设置当前笔刷('黄色1px线')
        self.paint.drawText(4 + self.左侧补丁边距, self.顶部补丁边距 - 4, str(self.parent.股票数据['股票名称']))  # 股票名称
        self.paint.drawText(4 + self.左侧补丁边距 + 140, self.顶部补丁边距 - 4, str('昨收：'))
        self.paint.drawText(4 + self.左侧补丁边距 + 240, self.顶部补丁边距 - 4, str('今开：'))
        self.paint.drawText(4 + self.左侧补丁边距 + 340, self.顶部补丁边距 - 4, str('今收：'))
        self.paint.drawText(4 + self.左侧补丁边距 + 440, self.顶部补丁边距 - 4, str('涨跌：'))
        昨收 = self.parent.股票数据['上一个交易日收盘价']
        今收 = self.parent.股票数据['当前价']
        if 昨收 > 今收:
            self.设置当前笔刷('绿色1px线')
        if 昨收 == 今收:
            self.设置当前笔刷('白色1px线')
        if 昨收 < 今收:
            self.设置当前笔刷('红色1px虚线')

        self.paint.drawText(4 + self.左侧补丁边距 + 180, self.顶部补丁边距 - 4, str(昨收))
        self.paint.drawText(4 + self.左侧补丁边距 + 280, self.顶部补丁边距 - 4, str('%.2f' % self.parent.股票数据['开盘价']))
        self.paint.drawText(4 + self.左侧补丁边距 + 380, self.顶部补丁边距 - 4, str('%.2f' % self.parent.股票数据['当前价']))
        self.paint.drawText(4 + self.左侧补丁边距 + 480, self.顶部补丁边距 - 4, str(self.parent.股票数据['涨跌']))

    def 绘制K线(self):
        _最高价 = self.parent.股票数据['K线数据']['周期最高价'] + 2
        _最低价 = self.parent.股票数据['K线数据']['周期最低价']-1.5
        mCandleWidth = (self.表格宽度)/ len(self.parent.股票数据['K线数据']['日K线数据']) ;
        _rate = (self.表格高度 * 0.6 ) / (_最高价 - _最低价)

        i = 0
        五日路径 = QtGui.QPainterPath()
        十日路径 = QtGui.QPainterPath()
        二十日路径 = QtGui.QPainterPath()
        三十日路径 = QtGui.QPainterPath()

        for _K线数据 in self.parent.股票数据['K线数据']['日K线数据']:

            open = ( _最高价- _K线数据['开盘价']) * _rate + self.顶部补丁边距
            close = (_最高价 - _K线数据['收盘价']) * _rate   +  self.顶部补丁边距
            high = (_最高价 - _K线数据['最高价']) * _rate  +  self.顶部补丁边距
            low = (_最高价- _K线数据['最低价']) * _rate  +  self.顶部补丁边距

            left =  mCandleWidth * i + self.左侧补丁边距
            right =  mCandleWidth * (i + 1) + self.左侧补丁边距
            startX =  right - (mCandleWidth ) / 2
            if open < close:

                self.设置当前笔刷('绿色1px线')
                self.paint.fillRect(left, close, mCandleWidth,open-close,QtCore.Qt.green)
                self.paint.drawLine(startX, low, startX,high )
                self.paint.drawLine(startX, open, startX, close)
            elif open == close:

                self.paint.drawLine(left, open, right, open)
                self.paint.drawLine(startX, high, startX, low)
            else:
                self.设置当前笔刷('红色1px线')
                self.paint.fillRect(left, open, mCandleWidth,close-open,QtCore.Qt.red)
                self.paint.drawLine(startX, high, startX, low)
                self.paint.drawLine(startX, close, startX, open)

            w = i * mCandleWidth + self.左侧补丁边距
            y1 = (_最高价 - _K线数据['5日'])  * _rate + self.顶部补丁边距
            y2 = (_最高价 - _K线数据['10日']) * _rate + self.顶部补丁边距
            y3 = (_最高价 - _K线数据['20日']) * _rate + self.顶部补丁边距
            y4 = (_最高价 - _K线数据['30日']) * _rate + self.顶部补丁边距
            y1 = y1 if y1 > self.顶部补丁边距 else self.顶部补丁边距+2
            y2 = y2 if y2 > self.顶部补丁边距 else self.顶部补丁边距+2
            y3 = y3 if y3 > self.顶部补丁边距 else self.顶部补丁边距+2
            y4 = y4 if y4 >  self.顶部补丁边距 else self.顶部补丁边距+2
            if i == 0:

                五日路径.moveTo(w, y1)
                十日路径.moveTo(w, y2)
                二十日路径.moveTo(w, y3)
                三十日路径.moveTo(w, y4)



            五日路径.lineTo(w, y1)
            十日路径.lineTo(w, y2)
            二十日路径.lineTo(w, y3)
            三十日路径.lineTo(w, y4)
            i += 1
        self.paint.drawPath(五日路径)
        self.设置当前笔刷('黄色1px线')
        self.paint.drawPath(十日路径)
        self.设置当前笔刷('亮蓝1px线')
        self.paint.drawPath(二十日路径)
        self.设置当前笔刷('白色1px线')
        self.paint.drawPath(三十日路径)

    def 绘制VOL(self):
         _当前最高成交量 = self.parent.股票数据['K线数据']['周期成交量高值']
         _K线表格高度 = ((self.表格高度 + self.顶部补丁边距 ) * 0.8)
         w_radio = (self.表格宽度) / len(self.parent.股票数据['K线数据']['日K线数据'])
         h_radio = (_K线表格高度 * 0.2) / _当前最高成交量
         y = _K线表格高度 + 5
         self.设置当前笔刷('黄色1px线')
         for i in range(0, len(self.parent.股票数据['K线数据']['日K线数据'])):
            x = i * w_radio + self.左侧补丁边距
            y2 = h_radio * self.parent.股票数据['K线数据']['日K线数据'][i]['成交量']
            if(self.parent.股票数据['K线数据']['日K线数据'][i]['开盘价'] > self.parent.股票数据['K线数据']['日K线数据'][i]['收盘价']):
              self.paint.fillRect(x, y  , w_radio, -y2, QtCore.Qt.green)
            else:
               self.paint.fillRect(x, y , w_radio,  -y2,QtCore.Qt.red)

    def 绘制MACD(self):
         _最高 = self.parent.股票数据['K线数据']['周期MACD高值']
         _最低 = self.parent.股票数据['K线数据']['周期MACD低值']
         _K线表格高度 = ((self.表格高度 + self.顶部补丁边距) * 0.85)
         _rate = (_K线表格高度 * 0.15)  / (_最高 - _最低);
         w_radio = (self.主窗宽 - self.总宽)/ len(self.parent.股票数据['K线数据']['日K线数据']) ;
         _dif = QtGui.QPainterPath()
         _dea = QtGui.QPainterPath()
         _zero =  _K线表格高度 + (_最高*_rate)
         if _zero < _K线表格高度:
           _zero=_K线表格高度 +20
         i = 0
         for _K线数据 in self.parent.股票数据['K线数据']['日K线数据']:
              top = ((_最高 - _K线数据['macd']) * _rate) + _K线表格高度
              x = self.左侧补丁边距 +  w_radio * i
              if _K线数据['macd'] > 0:
                 self.设置当前笔刷('红色1px线')
                 self.paint.drawLine( x, top ,x ,_zero)
              else:
                  self.设置当前笔刷('绿色1px线')
                  bottom = ((_最高 - _K线数据['macd']) * _rate) +_K线表格高度
                  self.paint.drawLine(x, _zero,  x, bottom)

              w = i * w_radio + self.左侧补丁边距
              y1 = (_最高 - _K线数据['dif'])  * _rate + _K线表格高度
              y2 = (_最高 - _K线数据['dea']) * _rate + _K线表格高度
              if i==0:
                _dif.moveTo(w,y1)
                _dea.moveTo(w,y2)
              _dif.lineTo(w, y1)
              _dea.lineTo(w, y2)
              i=i+1

         self.设置当前笔刷('黄色1px线')
         self.paint.drawPath(_dif)
         self.设置当前笔刷('亮蓝1px线')
         self.paint.drawPath(_dea)







